
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Mybatis的常用标签? - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Mybatis的常用标签? - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在MyBatis的插入操作中，如何配置以获取数据库自动生成的主键并将其映射回Java对象？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在<insert>标签中，通过设置`useGeneratedKeys="true"`来启用自动生成主键的功能，并使用`keyProperty`属性指定主键值应映射到输入参数对象的哪个属性上。</div>
          </div>
          <div class="card-source">来源: 1.2 <insert></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">MyBatis中的动态SQL标签<if>的作用是什么？它是如何实现条件判断的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer"><if>标签用于根据条件动态地构建SQL语句。它通过`test`属性来指定一个条件表达式（支持OGNL），只有当该表达式为真时，<if>标签内部的SQL片段才会被包含进最终的SQL语句中。</div>
          </div>
          <div class="card-source">来源: 2.1 <if></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">当需要根据不同条件只选择一个SQL分支时，应该使用MyBatis中的哪些标签组合？它们的关系是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应该使用`<choose>`、`<when>`和`<otherwise>`标签组合，这类似于Java中的`switch`语句。`<choose>`作为父标签，内部可以包含多个`<when>`标签用于不同的条件判断，以及一个可选的`<otherwise>`标签作为所有条件都不满足时的默认分支。</div>
          </div>
          <div class="card-source">来源: 2.2 <choose>、<when>、<otherwise></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在MyBatis中，<resultMap>标签主要解决了什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer"><resultMap>标签主要用于定义复杂的结果映射关系，特别是解决数据库表字段名称与Java对象属性名称不一致的情况。它允许开发者显式地将查询结果的列映射到对象的属性上。</div>
          </div>
          <div class="card-source">来源: 3.2 <resultMap></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">如何利用MyBatis的标签来定义可重用的SQL片段，以提高代码的维护性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用`<sql>`标签来定义一个可重用的SQL片段，并为其指定一个唯一的`id`。然后在需要使用该片段的地方，通过`<include>`标签并引用其`refid`来将其引入，从而避免代码重复。</div>
          </div>
          <div class="card-source">来源: 3.3 <sql> 和 <include></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请解释MyBatis中<foreach>标签的用途及其核心属性。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer"><foreach>标签用于迭代一个集合类型的参数，以便构建批量处理的SQL（例如IN子句）。其核心属性包括：`collection`指定要迭代的集合，`item`定义当前迭代元素的别名，`open`和`close`分别定义整个循环内容的前缀和后缀，`separator`定义元素之间的分隔符。</div>
          </div>
          <div class="card-source">来源: 3.1 <foreach></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在构建动态的UPDATE语句时，使用<set>标签相比于多个<if>标签有什么优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在UPDATE语句中，<set>标签可以自动处理SQL语句中SET子句的格式问题。它会智能地添加`SET`关键字，并移除由内部<if>条件产生的多余的、位于末尾的逗号，从而简化动态更新语句的编写。</div>
          </div>
          <div class="card-source">来源: 2.3 <trim>、<where>、<set></div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">应用</div>
          <div class="card-question">根据文档，MyBatis的批量操作通常是哪个标签的应用场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">应用</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">执行批量插入、更新或删除操作是`<foreach>`标签的典型应用场景。使用它可以简化批量操作的SQL构建，提高效率。</div>
          </div>
          <div class="card-source">来源: 2. 批量操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在MyBatis的<select>标签中，用于指定返回结果类型的两个关键属性是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">两个关键属性是`resultType`和`resultMap`。`resultType`用于直接指定返回结果的Java类型，而`resultMap`用于指定一个预先定义好的自定义结果映射。</div>
          </div>
          <div class="card-source">来源: 1.1 <select></div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
